package com.stsdai.cart.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.stsdai.cart.redis.RedisUtils;
import com.stsdai.cart.service.CartService;
import com.stsdai.manager.mapper.ItemMapper;
import com.stsdai.manager.pojo.Cart;
import com.stsdai.manager.pojo.Item;

@Service
public class CartServiceImpl implements CartService {

	private static final ObjectMapper MAPPER = new ObjectMapper();

	@Autowired
	private RedisUtils redisUtils;

	@Autowired
	private ItemMapper itemMapper;

	@Value("${STSDAI_CART_KEY}")
	private String STSDAI_CART_KEY;

	@Override
	public void addItemByCart(Long userId, Long itemId, Integer num) {
		// 查询用户原来的购物车
		List<Cart> list = this.queryCartByUserId(userId);

		// 声明购物车对象
		Cart cart = null;
		// 遍历购物车
		for (Cart c : list) {
			// 判断购物车中是否存在该商品
			if (c.getItemId().longValue() == itemId.longValue()) {
				// 如果存在，给购物车对象赋值
				cart = c;

				// 跳出循环
				break;
			}
		}
		if (cart != null) {
			// 如果cart不为空，表示商品存在，则商品数量相加
			cart.setNum(cart.getNum() + num);
			cart.setUpdated(new Date());

		} else {
			// 如果cart为空，表示商品不存在，则把商品添加到购物车中
			// 查询商品数据
			Item item = this.itemMapper.selectByPrimaryKey(itemId);

			// 创建购物车对象
			cart = new Cart();

			// 给购物车，设置商品数据
			cart.setNum(num);
			cart.setUserId(userId);
			cart.setItemId(itemId);
			// 判断商品图片不为空
			if (item.getImages() != null) {
				cart.setItemImage(item.getImages()[0]);
			} else {
				// 如果图片为空，设置空串
				cart.setItemImage("");
			}
			cart.setItemPrice(item.getPrice());
			cart.setItemTitle(item.getTitle());
			cart.setCreated(new Date());
			cart.setUpdated(cart.getCreated());
			cart.setShopId(item.getShopid());

			// 添加到购物车中
			list.add(cart);

		}

		try {
			// 把修改后的购物车保存到redis,需要把购物车list转为json格式的数据
			this.redisUtils.set(this.STSDAI_CART_KEY + userId, MAPPER.writeValueAsString(list));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	// public static void main(String[] args) {
	// Integer a = 128;
	// Integer aa = 128;
	//
	// Long b = 128l;
	// Long bb = 128l;
	//
	// System.out.println(a == aa);
	// System.out.println(b == bb);
	//
	// System.out.println(a.intValue() == aa.intValue());
	// System.out.println(b.longValue() == bb.longValue());
	//
	// }

	@Override
	public List<Cart> queryCartByUserId(Long userId) {
		// 从redis中查询原来的购物车，查询到的是json格式的数据
		// 购物车的key需要添加前缀，方便redis维护和管理，key：前缀+用户id
		String json = this.redisUtils.get(this.STSDAI_CART_KEY + userId);

		// 判断json数据不为空
		if (StringUtils.isNotBlank(json)) {
			try {
				// 把json格式的数据转为List《Cart》购物车数据
				List<Cart> list = MAPPER.readValue(json,
						MAPPER.getTypeFactory().constructCollectionType(List.class, Cart.class));

				// 返回购物车数据
				return list;
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		// 如果查询结果为空，或者转换异常，不能返回null，需要返回空集合
		return new ArrayList<>();
	}

	@Override
	public void updateNumByCart(Long userId, Long itemId, Integer num) {
		// 查询用户的购物车
		List<Cart> list = this.queryCartByUserId(userId);

		// 遍历购物车
		for (Cart cart : list) {
			// 判断购物车中是否存在该商品
			if (cart.getItemId().longValue() == itemId.longValue()) {
				// 如果存在商品，修改商品数量
				cart.setNum(num);
				cart.setUpdated(new Date());

				try {
					// 把修改后的购物车保存到redis中
					this.redisUtils.set(this.STSDAI_CART_KEY + userId, MAPPER.writeValueAsString(list));
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				// 跳出循环
				break;
			}
		}
	}

	@Override
	public void deleteItemById(Long userId, Long itemId) {
		// 查询
		List<Cart> list = this.queryCartByUserId(userId);

		// 遍历
		for (Cart cart : list) {
			// 判断
			if (cart.getItemId().longValue() == itemId.longValue()) {
				// 删除
				list.remove(cart);

				try {
					// 保存
					this.redisUtils.set(this.STSDAI_CART_KEY + userId, MAPPER.writeValueAsString(list));
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				// 跳出
				break;
			}
		}
	}

	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();

		list.add(1);
		list.add(2);
		list.add(3);
		list.add(4);

		System.out.println(list.size());
		for (Integer i : list) {
			if (i == 1) {
				list.remove(i);
				break;
			}

		}
		System.out.println(list.size());

	}

}
